<?php

/**
 * @author Grover Campos
 * @version 1.0
 * @created 03-ago-2009 06:43:06 p.m.
 */
class Gtux_Model_Gateway_Campo extends Gtux_Model_Gateway_Abstract 
{

  /**
   * Devuelve la tabla
   *
   * @return Gtux_Model_Table_Campo
   */
  public function getDbTable()
  {
    if (null == $this->_dbTable) 
    {
      $this->setDbTable('Gtux_Model_Table_Campo');
    }
    return $this->_dbTable;
  }
  
	/**
	 * 
	 * @param Gtux_Model_Campo $campo
	 */
	public function delete(Gtux_Model_Abstract $campo)
	{
    $where = 'id_formulario = '.$campo->getSubformulario()->getIdFormulario();
    $where .= ' AND id_subformulario = '.$campo->getIdSubformulario();
    $where .= ' AND ';
    $where .= $this->getDbTable()
                  ->getAdapter()
                  ->quoteInto('id_campo = ?', $campo->getIdCampo());
    return $this->getDbTable()->delete($where);
	}

	/**
	 * 
	 * @param int $id_campo
	 * @param Gtux_Model_Campo $campo
	 */
	public function find($id_campo, Gtux_Model_Abstract $campo)
	{
	  if ($campo->getSubformulario() instanceof Gtux_Model_Subformulario)
	  {
  	  $subf = $campo->getSubformulario();
  	  $rs = $this->getDbTable()
  	             ->find($subf->getIdFormulario(),
  	                    $subf->getIdSubformulario(),
  	                    $id_campo);
      
      if (0 == count($rs)) 
      {
        return;
      }
      $row      = $rs->current();
      $rowArray = $row->toArray();
      foreach ($rowArray as $column => $value) 
      {
        if (!in_array($column, array('id_formulario', 'id_subformulario')))
        {
          $campo->$column = $value;
        }
      }      	                          
	  }
	}

	public function fetchAll()
	{
    $rs      = $this->getDbTable()->fetchAll();
    $entries = array();
    foreach ($rs as $row) 
    {
      $entries[] = new Gtux_Model_Campo(null, $row);
    }
    return $entries;
	}

	/**
	 * 
	 * @param Gtux_Model_Campo $campo
	 * @return int
	 */
	public function insert(Gtux_Model_Abstract $campo)
	{
	  $data = array(
	    'id_formulario'     => $campo->getSubformulario()->getIdFormulario(),
	    'id_subformulario'  => $campo->getIdSubformulario(),
	    'nombre'            => $campo->getNombre(),
	    'etiqueta'          => $campo->getEtiqueta(),
	    'campo_tabla'       => $campo->getCampoTabla(),
	    'requerido'         => $campo->getRequerido(),
	    'visible'           => $campo->getVisible(),
	    'tipo_dato'         => $campo->getTipoDato(),
	    'id_elemento'       => $campo->getIdElemento(),
	    'tipo_validacion'   => $campo->getTipoValidacion(),
	    'validacion_params' => $campo->getValidacionParams(),
	    'mensaje_error'     => $campo->getMensajeError(),
	    'descripcion'       => $campo->getDescripcion(),
	    'id_user'           => $campo->getIdUser(),
	    'created_at'        => $campo->getCreatedAt()->toString(Zend_Date::ISO_8601),
	    'tabla_foranea'     => $campo->getTablaForanea(),
	    'listado'           => $campo->getListado() 
	  );
	  $id = $campo->getIdCampo(); 
	  if (null == $id) 
	  {
	  	return $this->getDbTable()->insert($data);
	  }
	  else
	  {
	    $this->_logger->err('Se intento insertar un campo con id');
      throw new Zend_Db_Exception('Se intento insertar un campo con id');
	  }
	}

	/**
	 * (non-PHPdoc)
	 * @see library/Gtux/Model/Gateway/Gtux_Model_Gateway_Abstract#update($model)
	 */
	public function update(Gtux_Model_Abstract $campo)
	{
	  $data = array();
	  if ($campo->getSubformulario() instanceof Gtux_Model_Subformulario)
	  {
  	  if ($campo->getSubformulario()->getIdFormulario()>0) 
  	  {
  	  	$data['id_formulario'] = $campo->getSubformulario()->getIdFormulario();
  	  }
  	  if ($campo->getSubformulario()->getIdSubformulario()>0) 
  	  {
  	  	$data['id_subformulario'] = $campo->getIdSubformulario();
  	  }
	  }
	  if (strlen($campo->getNombre())>0) 
	  {
	  	$data['nombre'] = $campo->getNombre();
	  }
	  if (strlen($campo->getEtiqueta())>0) 
	  {
	  	$data['etiqueta'] = $campo->getEtiqueta();
	  }
	  if (strlen($campo->getCampoTabla())>0) 
	  {
	  	$data['campo_tabla'] = $campo->getCampoTabla();
	  }
	  if (!is_null($campo->getRequerido())) 
	  {
	  	$data['requerido'] = (bool)$campo->getRequerido();
	  }
	  if (NULL !== $campo->getVisible()) 
	  {
	  	$data['visible'] = (bool)$campo->getVisible();
	  }
	  if ($campo->getTipoDato()>0) 
	  {
	  	$data['tipo_dato'] = $campo->getTipoDato();
	  }
	  if ($campo->getTipoValidacion() > 0) 
	  {
	  	$data['tipo_validacion'] = $campo->getTipoValidacion();
	  }
	  if (strlen($campo->getValidacionParams()) >0 ) 
	  {
	  	$data['validacion_params'] = $campo->getValidacionParams();
	  }
	  if (strlen($campo->getMensajeError())>0) 
	  {
	  	$data['mensaje_error'] = $campo->getMensajeError();
	  }
	  if (strlen($campo->getDescripcion())>0) 
	  {
	  	$data['descripcion'] = $campo->getDescripcion();
	  }
	  if (strlen($campo->getTablaForanea()) > 0) 
	  {
	  	$data['tabla_foranea'] = $campo->getTablaForanea();
	  }
	  if (NULL !== $campo->getListado())
	  {
	    $data['listado'] = $campo->getListado();
	  }
	  $id = $campo->getIdCampo();
	  
    if (null !== $id && sizeof($data)>0)
    {
      $db = $this->getDbTable()->getAdapter();
      $subformulario = $campo->getSubformulario();
      
      $where  = $db->quoteInto('id_formulario = ?', $subformulario->getIdFormulario(), Zend_Db::INT_TYPE);
      $where .= ' AND '. $db->quoteInto('id_subformulario = ?', $subformulario->getIdSubformulario(), Zend_Db::INT_TYPE);
      $where .= ' AND '. $db->quoteInto('id_campo = ?', $campo->getIdCampo(), Zend_Db::INT_TYPE);
                    
      return $this->getDbTable()->update($data, $where);
    }
    else
    {
      $this->_logger->err('Error al actualizar campo');
      throw new Zend_Db_Exception('Error al actualizar campo');
    }
	}

  /**
   * @see Gtux_Model_Gateway_Abstract::save()
   *
   * @param Gtux_Model_Abstract $model
   */
  public function save(Gtux_Model_Abstract $campo)
  {
    $id = $campo->getIdCampo();
    if ($campo->getSubformulario() instanceof Gtux_Model_Subformulario)
    {
      if (NULL == $id) 
      {
        $id = $this->insert($campo);
        $campo->setIdCampo($id['id_campo']);
        return true;
      }
      else 
      {
        return $this->update($campo);
      }    
    }
    return false;
  }

}
?>